#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <stdbool.h>
#include "struct.h"
#include "msg_queue.h"

static int msgid_ctos;
static int msgid_stoc;

static bool src_acc(int user_account,int money)
{
	User user = {};
	char path[50]="user/";
	sprintf(path,"%s%d.txt",path,user_account);
	if(0 > access(path,F_OK))
	{
		return false;
	}
	int fd = open(path,O_RDONLY);
	if(0 > read(fd,&user,sizeof(User)))
	{
		perror("read");
		return false;
	}
	if(user.money<money)
	{
		return false;
	}
	user.money -= money;
	close(fd);
	printf("money1:%d\n",user.money);
	save_data(path,user);
	return true;
}

static bool dest_acc(char* user_account,int money)
{
	User user = {};
	char path[50]="user/";
	strcat(path,user_account);
	strcat(path,".txt");
	puts(path);
	if(0 > access(path,F_OK))
	{
		return false;
	}
	int fd = open(path,O_RDONLY);
	if(0 > read(fd,&user,sizeof(User)))
	{
		perror("read");
		return false;
	}
	user.money += money;
	close(fd);
	printf("money2:%d\n",user.money);
	save_data(path,user);
	return true;
}

int main()
{

	msgid_ctos = get_ctos_msg();
	msgid_stoc = get_stoc_msg();
	Msg msg_ctos = {};
	Msg msg_stoc = {};
	if(0 > msgrcv(msgid_ctos,&msg_ctos,sizeof(Msg),TYPE_TRANSF,0))
	{
		perror("msgrcv");
		return -1;
	}
	printf("-------------\n");
	if(src_acc(msg_ctos.user.account,msg_ctos.user.money)&&dest_acc(msg_ctos.user.id,msg_ctos.user.money))
	{
		strcpy(msg_stoc.result,"转账成功");
	}else{
		strcpy(msg_stoc.result,"服务器升级中...");
	}
	
	msg_stoc.type = msg_ctos.pid;
	printf("%s\n",msg_stoc.result);
	msgsnd(msgid_stoc,&msg_stoc,sizeof(Msg)-sizeof(msg_stoc.type),0);
}
